
// 路由鉴权，设置某一个路由什么条件下可以访问，什么条件下不可以访问
import router from '@/router'
import nprogress from 'nprogress'
import "nprogress/nprogress.css"
import pinia from '@/store'
import useUserStore from '@/store/user'
import setting from '@/settings'

nprogress.configure({ showSpinner: false });  // 去掉右边的加载小圈

// 获取小仓库数据时，必须要加载大仓库，当大仓库还没被项目加载时，可以用这种方式载入
let userStore = useUserStore(pinia)

if(userStore.username && userStore.userRouters){
    userStore.addUserRote(userStore.userRouters)
}

// 全局守卫，项目中任意路由切换都会触发的钩子

// 全局前置守卫，访问任意路由前触发的钩子
router.beforeEach(async (to, from, next) => {
    // 访问路由之前会触发的函数,to你从哪个路由来，from你将要访问哪个路由，next放行
    document.title = `${setting.title.substring(0,4)}-${to.meta.title}`

    nprogress.start()  // 路由进度条开始
    let userInfo = userStore.userInfo
    let username = userStore.username
    // !{...to}
    if (userInfo) {
        // 用户已登录

        if (to.path == '/login') {
            // 当用户已登录的情况下，访问登录页面时，跳转到首页
            next({ path: '/' })
        } else {
            // 获取用户信息，如果存在用户信息则直接放行，如果不存在用户信息则获取用户信息
            if (username) {
                next()
            } else {
                
                try {
                    await userStore.getUserInfo()
                    next()
                } catch (error) {
                    // 如果获取用户信息失败，一般来说是token过期，或者本地的token被用户清理掉了。则退出登录清空本地数据，然后重新登录
                    await userStore.userLogout()
                    next({path:'/login',query:{redirect:to.path}})
                }

            }

        }

    } else {
        // console.log(to.path);
        // 没有获取到token，一般是用户未登录时则跳转到登录页面，并记录是从哪个路由跳转过去的，登录后又重新跳回来
        if (to.path == '/login') {
            next()
        } else {
            // 用户未登录时，访问其他页面，跳转到登录页，并记录用户想调转的地址
            next({ path: '/login', query: { redirect: to.path } })
        }
    }
    // next()
})
// 全局后置守卫，访问任意路由后触发的钩子
router.afterEach((to, from) => {
    // 访问路由之后执行的方法
    nprogress.done()  // 路由进度条完成
})